package cn.kginglam.dynamic_excel.controller;


import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.kginglam.dynamic_excel.common.api.RespResult;
import cn.kginglam.dynamic_excel.common.constant.KeyConstant;
import cn.kginglam.dynamic_excel.common.utils.RedisUtils;
import cn.kginglam.dynamic_excel.excel.listener.StudentInfoImportListener;
import cn.kginglam.dynamic_excel.excel.option.StudentInfoOption;
import cn.kginglam.dynamic_excel.excel.utils.DynamicExcelUtils;
import cn.kginglam.dynamic_excel.model.entity.StudentInfo;
import cn.kginglam.dynamic_excel.model.excel.StudentInfoImportModule;
import cn.kginglam.dynamic_excel.service.StudentInfoService;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * <p>
 * 开放学员信息表 前端控制器
 * </p>
 *
 * @author Lam
 * @since 2021-09-02
 */
@RestController
@RequestMapping("/dynamic_excel/student_info")
public class StudentInfoController {

    @Autowired
    private StudentInfoService studentInfoService;
    @Autowired
    private RedisUtils redisUtils;


    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @ResponseBody
    public RespResult get(@PathVariable Long id) {
        StudentInfo studentInfo = studentInfoService.getById(id);
        return RespResult.success(studentInfo);
    }

    /**
     * 导出 （支持自定义）
     *
     * @param currentPage       开始页
     * @param pageSize          每页容量
     * @param studentInfoOption 自定义导出选项
     * @param response
     * @return
     */
    @RequestMapping(value = "/exports/{currentPage}/{pageSize}", method = RequestMethod.GET)
    @ResponseBody
    public RespResult export(@PathVariable Integer currentPage,
                             @PathVariable Integer pageSize,
                             @RequestBody StudentInfoOption studentInfoOption,
                             HttpServletResponse response) {


        Page<StudentInfo> page = new Page<>(currentPage, pageSize);
        IPage<StudentInfo> StudentPage = studentInfoService.page(page);

        // 自定义导出
        DynamicExcelUtils.export(StudentPage.getRecords(), studentInfoOption, response);

        return RespResult.success(StudentPage);
    }


    /**
     * 导入大量 Excel
     * 可以参考：https://my.oschina.net/famoustone/blog/856736
     *
     * @param file
     * @return
     */
    @RequestMapping(value = "/imports", method = RequestMethod.POST)
    @ResponseBody
    public RespResult importStudent(@RequestParam(value = "file") MultipartFile file) {

        if (ObjectUtil.isNull(file)) {
            return RespResult.failed("文件为空");
        }

        // 1.获取文件输入流
        try (InputStream inputStream = file.getInputStream()) {

            // 2.创建数据监听器（每一条数据）
            StudentInfoImportListener studentInfoImportListener = new StudentInfoImportListener();


            // 3. 读取输入流
            // - .read() -> 读配置 -> inputStream流 | StudentInfoImportModule 数据模型 | studentInfoImportListener 监听器
            // - .sheet()页，默认从0开始（下标0开始）| .readSheet(0) 指定下标
            // - .headRowNumber(1) 可以设置1，因为头就是一行。如果多行头，可以设置其他值。不传入也可以，没有指定头，也就是默认1行
            // - .doRead() 开始读
            EasyExcel.read(inputStream, StudentInfoImportModule.class, studentInfoImportListener)
                    .sheet()
                    .headRowNumber(1)
                    .doRead();


            // 4.获取读取好的数据
            /* studentInfoImportModuleList 全部数据 */
            List<StudentInfoImportModule> studentInfoImportModuleList = studentInfoImportListener.getStudentInfoImportModuleList();
            /* 校验成功的数据 */
            List<StudentInfoImportModule> studentInfoImportModuleSuccessList = studentInfoImportListener.getStudentInfoImportModuleSuccessList();
            /* 校验失败的数据 */
            List<StudentInfoImportModule> studentInfoImportModuleErrorList = studentInfoImportListener.getStudentInfoImportModuleErrorList();

            // 5.将校验好的数据导入数据库
            studentInfoService.importExcel2Database(studentInfoImportModuleSuccessList);

            // 6.将失败的数据存进redis
            if (CollectionUtil.isNotEmpty(studentInfoImportModuleErrorList)) {
                String errorDataKey = KeyConstant.substitute(KeyConstant.STUDENT_EXCEL_ERROR_DATA, "1");
                studentInfoImportModuleErrorList.forEach(error -> redisUtils.zAdd(errorDataKey, error, error.getCurrentRowNum()));
            }


        } catch (IOException e) {
            e.printStackTrace();
        }

        return RespResult.success(null);
    }


    /**
     * 检查Excel导入情况
     * @return
     */
    @RequestMapping(value = "/import/states", method = RequestMethod.GET)
    @ResponseBody
    public RespResult importStudentStates() {

        String importFinishFlagKey = KeyConstant.substitute(KeyConstant.STUDENT_EXCEL_IMPORT_FINISH_FLAG, "1");
        Integer finish = (Integer) redisUtils.get(importFinishFlagKey);
        if(NumberUtil.equals(finish,0)){
            // TODO 导入完成，返回导入成功条数、返回导入失败数据
            return RespResult.success("导入完成");
        }

        return RespResult.success(null);
    }
}
